package com.ruoyi.json;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

public class BeanInfoUtil {

	/***************************
	 * @param obj   获得对象的类型
	 ***************************/
		public static Class getClass(Object obj)throws Exception{
			try{
				return obj.getClass();
			}catch(Exception ae){
				throw new Exception("获得对象类型出错!");
			}
		}
	/***************************
	 * 通过类型获得对象的类信息
	 ***************************/
		public static BeanInfo getBeanInfo(Class clazz) throws Exception{
			try{
				return Introspector.getBeanInfo(clazz);
			}catch(Exception e){
				throw new Exception("获得BEAN类信息出错！");
			}
		}
	/***************************
	 * 通过对象获得对象的类信息
	 ***************************/
		public static BeanInfo getBeanInfo(Object obj) throws Exception{
			try{
				return BeanInfoUtil.getBeanInfo(obj.getClass());
			}catch(Exception e){
				throw new Exception("获得BEAN类信息出错！");
			}
		}
	/***************************
	 * 通过类型获得类的所有属性集合
	 ***************************/
		public static PropertyDescriptor[] getPropertyDescriptors(Class clazz) throws Exception{
			try{
				return BeanInfoUtil.getBeanInfo(clazz).getPropertyDescriptors();
			}catch(Exception e){
				throw new Exception("获得BEAN类属性信息集合出错！");
			}
		}
	/***************************
	 * 通过对象获得类的所有属性集合
	 ***************************/
		public static PropertyDescriptor[] getPropertyDescriptors(Object obj) throws Exception{
			try{
				return BeanInfoUtil.getPropertyDescriptors(obj.getClass());
			}catch(Exception e){
				throw new Exception("获得BEAN类属性信息集合出错！");
			}
		}
	/***************************
	 * 通过BeanInfo获得类的所有属性集合
	 ***************************/
		public static PropertyDescriptor[] getPropertyDescriptors(BeanInfo beanInfo) throws Exception{
			try{
				return beanInfo.getPropertyDescriptors();
			}catch(Exception e){
				throw new Exception("获得BEAN类属性信息集合出错！");
			}
		}
	/***************************
	 * 获得BEAN属性的名称
	 ***************************/
		public static String getName(PropertyDescriptor props) throws Exception{
			try{
				return props.getName();
			}catch(Exception e){
				throw new Exception("获得BEAN属性的名称出错！");
			}
		}
	/***************************
	 * 获得BEAN属性的类型
	 ***************************/
		public static Class getPropertyType(PropertyDescriptor props) throws Exception{
			try{
				return props.getPropertyType();
			}catch(Exception e){
				throw new Exception("获得BEAN属性的类型出错！");
			}
		}
	/***************************
	 * 获得BEAN属性的get方法 
	 ***************************/
		public static Method getReadMethod(PropertyDescriptor props) throws Exception{
			try{
				return props.getReadMethod();
			}catch(Exception e){
				throw new Exception("获得BEAN属性的get方法出错！");
			}
		}	
	/***************************
	 * 获得BEAN属性的set方法 
	 ***************************/
		public static Method getWriteMethod(PropertyDescriptor props) throws Exception{
			try{
				return props.getWriteMethod();
			}catch(Exception e){
				throw new Exception("获得BEAN属性的set方法出错！");
			}
		}
	/*************************************
	 * 判断属性名是否是类内部属性 假表示是内部属性
	 *************************************/
		public static boolean rightName(PropertyDescriptor props) throws Exception{
			try{
				if(!(("class".equals(props.getName())
				||"multipartRequestHandler".equals(props.getName())
				||"servlet".equals(props.getName())
				||"servletWrapper".equals(props.getName())))){
					return true;
				}return false;
			}catch(Exception e){
				throw new Exception("判断属性名是否是类内部属性出错！");
			}
		}
	/*************************************
	 * 获得属性的参数类型集合
	 *************************************/
		public static Class[] getParameterTypes(PropertyDescriptor props)throws Exception{
			try{
				return props.getWriteMethod().getParameterTypes();
			}catch(Exception e){
				throw new Exception("获得属性的参数类型集合出错！");
			}
		}
	/*************************************
	 * 获得属性的返回类型
	 *************************************/
		public static Class getReturnType(PropertyDescriptor props)throws Exception{
			try{
				return props.getReadMethod().getReturnType();
			}catch(Exception e){
				throw new Exception("获得属性的返回类型出错！");
			}
		}
	/*************************************
	 * 获得属性的返回类型名称
	 *************************************/
		public static String getTypeName(PropertyDescriptor props)throws Exception{
			try{
				return props.getReadMethod().getReturnType().getName();
			}catch(Exception e){
				throw new Exception("获得属性的返回类型名称出错！");
			}
		}
	/*************************************
	 * 获得属性的值
	 *************************************/
		public static Object getValue(PropertyDescriptor props,Object obj)throws Exception{
			try{
				return props.getReadMethod().invoke(obj,null);
			}catch(Exception e){
				throw new Exception("获得属性的值出错！");
			}
		}

}
